﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;
using System.Web.UI.DataVisualization;
using System.Web.UI.DataVisualization.Charting;
using System.Drawing;
using System.Web.UI.HtmlControls;

namespace AudiPyme.UI
{
    public partial class EmpresaPrincipal : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                bool HayEmpresa;
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                if (EmpresaUsuario != 0)
                {
                    //Muestra los datos de la empresa
                    HayEmpresa = true;
                    GeneraOpciones(HayEmpresa);
                    Panel1.Visible = true;
                    PanelChartActRel.Visible = true;
                    PanelChartMadurez.Visible = true;
                    String NombreEmpresa = EmpresasFactory.NombreEmpresa(EmpresaUsuario);
                    LblEmpresa.Text = ": " + NombreEmpresa;
                    String TipoEmpresa = EmpresasFactory.TipoEmpresaEmpresa(EmpresaUsuario);
                    LblTipoEmpresa.Text = TipoEmpresa;
                    String Sector = EmpresasFactory.SectorEmpresa(EmpresaUsuario);
                    LblSector.Text = Sector;
                    int Facturacion = EmpresasFactory.FacturacionEmpresa(EmpresaUsuario);
                    LblFacturacion.Text = Facturacion.ToString();
                    PintaChartActRel();
                    PintaChartMadurez();
                }
                else
                {
                    HayEmpresa = false;
                    GeneraOpciones(HayEmpresa);
                    MuestraMensajeRedirige("No hay una empresa asociada al usuario " + NombreUsuario + ".\nSe redirigirá a la página para crear una ", "EmpresaCrear");
                }
            }
        }

        private void MuestraMensajeRedirige(string Mensaje, string Pagina)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            SB.Append("var vers = navigator.appVersion;if(vers.indexOf('MSIE 7.0') != -1) { window.location='" + Pagina + ".aspx';} else{ window.location='" + Pagina + ".aspx'; }");
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Success", SB.ToString(), true);
        }

        //Método para generar dinámicamente las opciones de navegación en la parte de Opciones
        private void GeneraOpciones(bool HayEmpresa)
        {
            try
            {
                if (HayEmpresa)
                {
                    //Añado la opcion Empresa Datos
                    HtmlGenericControl opc1 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc1);
                    HtmlGenericControl anchor = new HtmlGenericControl("a");
                    anchor.Attributes.Add("href", "EmpresaDatos.aspx");
                    anchor.InnerText = "Gestionar Datos Empresa";
                    opc1.Controls.Add(anchor);
                }
                else
                {
                    //Añade la opcion crear empresa
                    //Añado la opcion Empresa Datos
                    HtmlGenericControl opc1 = new HtmlGenericControl("li");
                    ListaOpciones.Controls.Add(opc1);
                    HtmlGenericControl anchor = new HtmlGenericControl("a");
                    anchor.Attributes.Add("href", "EmpresaCrear.aspx");
                    anchor.InnerText = "Crear Empresa";
                    opc1.Controls.Add(anchor);
                }
            }
            catch (System.Web.HttpException e1)
            {
                e1.ToString();
            }
        }

        //Método que muestra la información elegida en un chart
        private void PintaChartActRel()
        {
            try
            {
                //Recogemos la empresa asociada al usuario que inició la sesión
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                //Dependiendo de la opcion elegida en el DropDownList, el Chart mostrará los activos 
                //agrupados según el criterio seleccionado
                List<String> AtributosEmpresa = new List<String>();
                AtributosEmpresa.Add("Nº total de Activos");
                AtributosEmpresa.Add("Nº total de Relaciones");
                AtributosEmpresa.Add("Nº Relaciones Tipo Activo - Amenaza");
                AtributosEmpresa.Add("Nº Relaciones Tipo Activo - Vulnerabilidad");
                List<int> ValoresAtributosEmp = new List<int>();
                int NumActivosEmp = ActivosEmpresaFactory.NumeroTotalesActivosEmpresa(EmpresaUsuario);
                int NumRelTipActAmenCritEmp = InstanciaTiposActivosAmenazasCriteriosRiesgoFactory.NumRelacTipAmenCritEmpresa(EmpresaUsuario);
                int NumRelTipActVuln = InstanciaTiposActivosVulnerabilidadesFactory.NumRelacTipActVuln(EmpresaUsuario);
                int NumRelTotEmpresa = NumRelTipActAmenCritEmp + NumRelTipActVuln;
                if (NumRelTotEmpresa != 0)
                {
                    PanelChartActRel.Visible = true;
                    ValoresAtributosEmp.Add(NumActivosEmp);
                    ValoresAtributosEmp.Add(NumRelTotEmpresa);
                    ValoresAtributosEmp.Add(NumRelTipActAmenCritEmp);
                    ValoresAtributosEmp.Add(NumRelTipActVuln);
                    string[] coloresBarras = new string[] { "DeepSkyBlue", "Red", "Crimson", "Crimson" };
                    for (int i = 0; i < AtributosEmpresa.Count(); i++)
                    {
                        ChartActRel.Series["Series1"].Points.AddXY(AtributosEmpresa[i], ValoresAtributosEmp[i]);
                        ChartActRel.Series["Series1"].Points[i].Color = System.Drawing.Color.FromArgb(220, Color.FromName(coloresBarras[i]));
                        this.ChartActRel.Series["Series1"].ToolTip = "#AXISLABEL : #VALY. Pinche aquí para ir a su sección";
                    }
                    //
                    //Transparencia a las barras del chart
                    foreach (var serie in ChartActRel.Series)
                    {
                        serie.Color = Color.FromArgb(220, serie.Color);
                    }
                }
                else
                {
                    PanelChartActRel.Visible = false;
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al cargar el gráfico de empresa");
            }
        }

        private bool HayDatos(List<double> ListaDatos)
        {
            bool hay = false;
            for (int i = 0; i < ListaDatos.Count(); i++)
            {
                if (ListaDatos[i] != 0.0 && !double.IsNaN(ListaDatos[i]))
                {
                    hay = true;
                }
            }
            return hay;
        }

        //Método que pinta el gráfico de una empresa con los valores del nivel de madurez así como los de las empresas homónimas
        private void PintaChartMadurez()
        {
            try
            {
                //Recogemos la empresa asociada al usuario que inició la sesión
                String NombreUsuario = (String)Session["nombreUsuario"];
                int EmpresaUsuario = UsuariosFactory.EmpresaUsuario(NombreUsuario);
                List<String> EtiquetasMadurez = new List<String>();
                EtiquetasMadurez.Add("Madurez Actual Empresa");
                EtiquetasMadurez.Add("Madurez Actual Sector/Tamaño");
                EtiquetasMadurez.Add("Madurez Deseable Empresa");
                EtiquetasMadurez.Add("Madurez Deseable Sector/Tamaño");
                List<double> ValoresMadurez = new List<double>();
                double MadurezActualEmp = (double)EmpresasFactory.MadurezActualEmpresa(EmpresaUsuario);
                double MadurezActualSecTam = EmpresasFactory.MadurezActualSecTamEmpresa(EmpresaUsuario);
                double MadurezDeseabEmp = (double)EmpresasFactory.MadurezDeseadaEmpresa(EmpresaUsuario);
                double MadurezDeseadaSecTam = EmpresasFactory.MadurezDeseadaSecTamEmpresa(EmpresaUsuario);
                ValoresMadurez.Add(MadurezActualEmp);
                ValoresMadurez.Add(MadurezActualSecTam);
                ValoresMadurez.Add(MadurezDeseabEmp);
                ValoresMadurez.Add(MadurezDeseadaSecTam);
                string[] coloresBarras = new string[] { "DeepSkyBlue", "Red", "DeepSkyBlue", "Red" };
                if (HayDatos(ValoresMadurez))
                {
                    PanelChartMadurez.Visible = true;
                    for (int i = 0; i < EtiquetasMadurez.Count(); i++)
                    {
                        ChartMadurez.Series["Series1"].Points.AddXY(EtiquetasMadurez[i], ValoresMadurez[i]);
                        ChartMadurez.Series["Series1"].Points[i].Color = System.Drawing.Color.FromArgb(220, Color.FromName(coloresBarras[i]));
                        if (EtiquetasMadurez[i].Equals("Madurez Actual Empresa") || EtiquetasMadurez[i].Equals("Madurez Deseable Empresa"))
                        {
                            ChartMadurez.Series["Series1"].ToolTip = "#AXISLABEL : #VALY. Pinche aquí para gestionar dicho Nivel de Madurez.";
                        }
                    }
                    foreach (var serie in ChartActRel.Series)
                    {
                        serie.Color = Color.FromArgb(220, serie.Color);
                    }
                }
                else
                {
                    PanelChartMadurez.Visible = false;
                    MuestraMensaje("No se han definido los niveles de madurez para la empresa");
                }
            }
            catch (Exception e1)
            {
                e1.ToString();
                MuestraMensaje("Error al cargar el gráfico de niveles de madurez");
            }

        }



        protected void MuestraMensaje(string Mensaje)
        {
            StringBuilder SB = new StringBuilder();
            SB.Append("alert('");
            SB.Append(Mensaje.Replace("\n", "\\n").Replace("\r", "").Replace("'", "\\'"));
            SB.Append("');");
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "showalert", SB.ToString(), true);
        }

        //Evento que redirige a las páginas asociadas a los elementos del gráfico de activos-relaciones cuando se hace clic en ellos
        protected void ChartActRel_Click(object sender, ImageMapEventArgs e)
        {
            String OpcionElegida = e.PostBackValue;
            switch (OpcionElegida)
            {
                case "Nº total de Activos":
                    Response.Redirect("ActivosPrincipal.aspx");
                    break;
                case "Nº total de Relaciones":
                    Response.Redirect("RelacionesPrincipal.aspx");
                    break;
                case "Nº Relaciones Tipo Activo - Amenaza":
                    Response.Redirect("RelacionesGestTipActAmenCrit.aspx");
                    break;
                case "Nº Relaciones Tipo Activo - Vulnerabilidad":
                    Response.Redirect("RelacionesGestTipActVuln.aspx");
                    break;
                default:
                    PintaChartActRel();
                    PintaChartMadurez();
                    MuestraMensaje("Opción No Recogida");
                    break;
            }
        }

        //Evento que redirige a las páginas asociadas a los elementos del gráfico de niveles de madurez cuando se hace clic en ellos
        protected void ChartMadurez_Click(object sender, ImageMapEventArgs e)
        {
            String OpcionElegida = e.PostBackValue;
            switch (OpcionElegida)
            {
                case "Madurez Actual Empresa":
                    Response.Redirect("ControlesPrincipal.aspx");
                    break;
                case "Madurez Deseable Empresa":
                    Response.Redirect("EmpresaNivMadurezDeseadoGest.aspx");
                    break;
                default:
                    PintaChartActRel();
                    PintaChartMadurez();
                    MuestraMensaje("El parámetro " + OpcionElegida + " es solo comparativo. No tiene una página de gestión asociada");
                    break;
            }
        }

    }
}